#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

#define Task_num 10
typedef void(*task_t)();
task_t tasks[Task_num];

void task1()
{
    printf("这是一个打印信息的任务,pid:%d\n",getpid());
}
void task2()
{
    printf("这是一个检测网络的任务,pid:%d\n",getpid());
}
void task3()
{
    printf("这是一个打印图形化页面的任务,pid:%d\n",getpid());
}

int AddTask(task_t t);
void InitTask()
{
    int i=0;
    for(;i<Task_num;i++)
    {
        tasks[i]=NULL;
    }
    AddTask(task1);
    AddTask(task2);
    AddTask(task3);
}

int AddTask(task_t t)
{
    int pos=0;
    for(;pos<Task_num;pos++)
    {
        if(tasks[pos]==NULL)
        {
            break;
        }
    }
    if(pos==Task_num)return -1;
    tasks[pos]=t;
    return 0;
}

void DelTask()
{}
void CheckTask()
{}
void UpdateTask()
{}

void ExecuteTask()
{
    int i=0;
    for(;i<Task_num;i++)
    {
        if(tasks[i]!=NULL)
        {
            tasks[i]();
        }
    }
}

int main()
{
    pid_t id=fork();
    if(id<0)
    {
        perror("fork");
        return 1;
    }
    else if(id==0)
    {
        int cnt=5;
        while(cnt)
        {
            printf("I am child,pid:%d,ppid:%d,cnt:%d\n",getpid(),getppid(),cnt);
            cnt--;
            sleep(1);
        }
        exit(11);
    }
    else
    {
       // int cnt=5;
       // while(cnt)
       // {
       //    printf("I am parent,pid:%d,ppid:%d,cnt:%d\n",getpid(),getppid(),cnt);
       //    cnt--;
       //    sleep(1);
       // }
       InitTask();
        int status=0;
       // pid_t ret=waitpid(id,&status,0);
       while(1)
       {//轮询
              pid_t ret=waitpid(id,&status,WNOHANG);
              if(ret>0)
              {
                  // printf("wait success,ret=%d,exit sig:%d,exit code:%d\n",ret,status&0x7F,(status>>8)&0xFF);
                  if(WIFEXITED(status))
                  {
                      printf("代码是正常跑完的，退出码:%d\n",WEXITSTATUS(status));
                  }
                  else{
                      printf("代码出异常了\n");
                      //子进程出异常了
                  }
                  break;
              }
              else if(ret<0){
                  printf("wait fail!!\n");
                  //父进程调用函数失败了
                  break;
              }
              else{
                  //ret==0
                  //printf("子进程还没跑完，我（父进程）再等等...\n");
                  //sleep(1);
                  ExecuteTask();
                  sleep(1);
              }
       }
        sleep(3);
    }
    return 0;
}
//#define N 10
//void RunChild()
//{
//    int cnt=5;
//    while(cnt)
//    {
//        printf("I am child ,pid:%d,ppid:%d ,cnt:%d\n",getpid(),getppid(),cnt);
//        sleep(1);
//        cnt--;
//    }
//}
//int main()
//{
//    int i=0;
//    for(;i<N;i++)
//    {
//        pid_t id=fork();
//        if(id==0)
//        {
//            RunChild();
//            exit(i);//每个进程的退出码都不一样
//            //子进程在这里就退出了，不进行循环
//        }
//        //而父进程会按循环依次创建子进程
//        printf("Parent Create process : %d successfilly!\n",id);
//        //这句话只有父进程会执行
//    }
//    sleep(10);
//
//    for(i=0;i<N;i++)
//    {
//        //pid_t id=wait(NULL);
//        int status=0;
//        pid_t id=waitpid(-1,&status,0);
//        if(id>=0)
//        {
//            printf("wait %d successfully,exit code:%d\n",id,WEXITSTATUS(status));
//        }
//    }
//    sleep(5);
//    return 12;
//}
//
